libxc: mmapbatch-v2 adjustments
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 22 Jan 2010 10:59:51 +0000 (10:59 +0000)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 22 Jan 2010 10:59:51 +0000 (10:59 +0000)
Just like the kernel, the fallback implementation of
xc_map_foreign_bulk() should clear the error indication array upon
success.

Also, a few allocations were needlessly using calloc() instead of
malloc().

Finally, in xc_domain_save() allocate the error indicator array once
(along with the other arrays) instead of using realloc() (without
error checking) in the loop body.

Signed-off-by: Jan Beulich <jbeulich@novell.com>
tools/libxc/xc_domain_save.c
tools/libxc/xc_linux.c
tools/libxc/xc_misc.c

index aa9748a7e57a58f7a8afd21cb1811ed0d6bcce9b..2334b49c07d910e9cd5316dc0750b107eeaa625e 100644 (file)
@@ -1059,7 +1059,8 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
     pfn_type   = xc_memalign(PAGE_SIZE, ROUNDUP(
                               MAX_BATCH_SIZE * sizeof(*pfn_type), PAGE_SHIFT));
     pfn_batch  = calloc(MAX_BATCH_SIZE, sizeof(*pfn_batch));
-    if ( (pfn_type == NULL) || (pfn_batch == NULL) )
+    pfn_err    = malloc(MAX_BATCH_SIZE * sizeof(*pfn_err));
+    if ( (pfn_type == NULL) || (pfn_batch == NULL) || (pfn_err == NULL) )
     {
         ERROR("failed to alloc memory for pfn_type and/or pfn_batch arrays");
         errno = ENOMEM;
@@ -1273,7 +1274,6 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters,
             if ( batch == 0 )
                 goto skip; /* vanishingly unlikely... */
 
-            pfn_err = realloc(pfn_err, sizeof(int) * batch);
             region_base = xc_map_foreign_bulk(
                 xc_handle, dom, PROT_READ, pfn_type, pfn_err, batch);
             if ( region_base == NULL )
index 3f3bc10d95365bf1e301e4d7c95145cc58876d4a..55ceda1fcdbddaf9deea58278cd2bb3b9de562c4 100644 (file)
@@ -186,7 +186,7 @@ void *xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,
          * IOCTL_PRIVCMD_MMAPBATCH_V2 is not supported - fall back to
          * IOCTL_PRIVCMD_MMAPBATCH.
          */
-        xen_pfn_t *pfn = calloc(num, sizeof(*pfn));
+        xen_pfn_t *pfn = malloc(num * sizeof(*pfn));
 
         if ( pfn )
         {
index 44039b03be4c9f23296f133e6a85e6217d6fbe0c..04da3d2a3f3f703fa1af85b284d6a7f6d806b48b 100644 (file)
@@ -360,7 +360,7 @@ void *xc_map_foreign_pages(int xc_handle, uint32_t dom, int prot,
         return NULL;
     }
 
-    err = calloc(num, sizeof(*err));
+    err = malloc(num * sizeof(*err));
     if (!err)
         return NULL;
 
@@ -397,7 +397,7 @@ xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,
         return NULL;
     }
 
-    pfn = calloc(num, sizeof(*pfn));
+    pfn = malloc(num * sizeof(*pfn));
     if (!pfn) {
         errno = ENOMEM;
         return NULL;
@@ -416,7 +416,8 @@ xc_map_foreign_bulk(int xc_handle, uint32_t dom, int prot,
                 err[i] = -EINVAL;
                 break;
             }
-    }
+    } else
+        memset(err, 0, num * sizeof(*err));
 
     free(pfn);